#include "../include/LecteurSymbole.h"
#include <ctype.h>
#include <string.h>
#include <iostream>
#include <stdlib.h>
using namespace std;

LecteurSymbole::LecteurSymbole(string nomFich) : m_lc(nomFich), m_symCour("")
{
    suivant(); // pour lire le premier symbole
}

void LecteurSymbole::suivant()
{
    sauterSeparateurs();
    while(m_lc.getCarCour() == '#')
    {
        sauterCommentaire();
    }

    // on est maintenant positionne sur le premier caractère d'un symbole
    this->m_ligne = this->m_lc.getLigne();
    this->m_colonne = this->m_lc.getColonne();
    this->m_symCour = Symbole(motSuivant());    // on reconstruit symCour avec le nouveau mot lu
}

void LecteurSymbole::sauterSeparateurs()
{
    while(this->m_lc.getCarCour() == ' '  ||
            this->m_lc.getCarCour() == '\t' ||
            this->m_lc.getCarCour() == '\r' ||
            this->m_lc.getCarCour() == '\n')
    {
        this->m_lc.suivant();
    }
}

void LecteurSymbole::sauterCommentaire()
{
    if(this->m_lc.getCarCour() == '#')
    {
        while(this->m_lc.getCarCour() != '\r' && this->m_lc.getCarCour() != '\n')
        {
            this->m_lc.suivant();
        }
        sauterSeparateurs();
    }
}

string LecteurSymbole::motSuivant()
{
    static string  s;
    s = "";

    if(isdigit(this->m_lc.getCarCour()))       // c'est le début d'un entier
    {
        do
        {
            s = s + this->m_lc.getCarCour();
            this->m_lc.suivant();
        }
        while(isdigit(this->m_lc.getCarCour()));
    }

    else if(isalpha(this->m_lc.getCarCour()))       // c'est le début d'un mot
    {
        do
        {
            s = s + this->m_lc.getCarCour();
            this->m_lc.suivant();
        }
        while(isalpha(this->m_lc.getCarCour())  ||
                isdigit(this->m_lc.getCarCour()) ||
                this->m_lc.getCarCour() == '_');
    }

    else if(this->m_lc.getCarCour() == '"')    // c'est le début d'une chaine de caractères
    {
        do
        {
            s = s + this->m_lc.getCarCour();
            this->m_lc.suivant();
            if(m_lc.getCarCour() == EOF)
            {
                cout << "erreur : chaîne ne comportant pas son guillemet final";
                exit(-1);    //plus tard, lever exception
            }
        }
        while(this->m_lc.getCarCour() != '"');
        s = s + this->m_lc.getCarCour(); //on met le dernier caractère " dans la chaine
        this->m_lc.suivant();  //puis on avance ; fin de la chaîne
    }

    else if(this->m_lc.getCarCour() == '>' || this->m_lc.getCarCour() == '<' ||
            this->m_lc.getCarCour() == '=' || this->m_lc.getCarCour() == '!' ||
            this->m_lc.getCarCour() == '+' || this->m_lc.getCarCour() == '-')  //c'est une comparaison ou une affectation
    {
        do
        {
            s += this->m_lc.getCarCour();
            this->m_lc.suivant();
        }
        while(this->m_lc.getCarCour() == '=' || this->m_lc.getCarCour() == '+' || this->m_lc.getCarCour() == '-');
    }

    else if(this->m_lc.getCarCour() != EOF)    // c'est un caractere special
    {
        s = this->m_lc.getCarCour();
        this->m_lc.suivant();
    }

    return s;
}

